package cn.highedu.coolsharkhub.service.impl;


import cn.highedu.coolsharkhub.mapper.CategoryMapper;
import cn.highedu.coolsharkhub.pojo.dto.CategoryDTO;
import cn.highedu.coolsharkhub.pojo.entity.Category;
import cn.highedu.coolsharkhub.pojo.vo.CategoryManagementVO;
import cn.highedu.coolsharkhub.pojo.vo.CategoryVO;
import cn.highedu.coolsharkhub.service.CategoryService;
import cn.highedu.coolsharkhub.service.exception.BlankParameterException;
import cn.highedu.coolsharkhub.service.exception.EntityNotFoundException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 商品类别业务层实现类
 */
@Service
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    CategoryMapper categoryMapper;
    @Override
    public List<CategoryVO> findHomepageCategories() {
        // 1. 查询所有商品分类
        // 2. 过滤出显示的商品分类
        // 3. 将商品分类转换为商品分类视图对象
        // 4. 将商品分类视图对象收集到集合中
        // 不需要 display和orderNum 属性
        List<Category> categories = categoryMapper.selectAll();
        return categories.stream().filter(Category::display)
                .map(category -> new CategoryVO(category.id(), category.name()))
                .collect(Collectors.toList());
    }

    /**
     * 查询管理页面商品分类
     * @return 管理页面商品分类
     */
    @Override
    public List<CategoryManagementVO> findManagementCategories() {
        // 1. 查询所有商品分类
        // 2. 将商品分类转换为商品分类管理视图对象
        // 3. 将商品分类管理视图对象收集到集合中
        return categoryMapper.selectAll().stream()
                .map(category ->  new CategoryManagementVO(
                        category.id(),
                        category.name(),
                        category.display(),
                        category.orderNum())
                ).collect(Collectors.toList());
    }

    /**
     * 根据商品分类id删除商品分类
     * @param id 商品分类id
     * @throws BlankParameterException 商品分类id不合法
     * @throws EntityNotFoundException 商品分类不存在
     */
    @Override
    public void deleteById(Integer id) {
        //入口参数检查，如果不合法，抛出BlankParameterException异常
        if (id == null || id < 1) {
            throw new BlankParameterException("删除商品分类失败，商品分类id不合法");
        }
        //调用持久层对象的方法删除商品分类
        if (categoryMapper.deleteById(id) != 1) {
            throw new EntityNotFoundException("删除商品分类失败, 分类不存在");
        }
    }

    /**
     * 添加商品分类
     * @param categoryDTO 商品分类数据传输对象
     * @throws BlankParameterException 商品分类名称为null或者商品分类名称为空字符串
     */
    @Override
    public void addCategory(CategoryDTO categoryDTO) {
        //入口参数检查，如果不合法，抛出BlankParameterException异常
        if (categoryDTO == null || categoryDTO.name() == null || categoryDTO.name().trim().isEmpty()) {
            throw new BlankParameterException("添加商品分类失败，商品分类名称不能为空");
        }
        //调用持久层对象的方法添加商品分类
        Category category = new Category(null, categoryDTO.name(), categoryDTO.display(),
                categoryDTO.orderNum(), null, null);
        if (categoryMapper.insertCategory(category) != 1) {
            throw new EntityNotFoundException("添加商品分类失败");
        }
    }

    /**
     * 根据商品分类id更新商品分类
     * @param id 商品分类id
     * @param categoryDTO 商品分类数据传输对象
     */
    @Override
    public void updateCategory(Integer id, CategoryDTO categoryDTO) {
        //入口参数检查，如果不合法，抛出BlankParameterException异常
        if (id == null || id < 1) {
            throw new BlankParameterException("更新商品分类失败，商品分类id不合法");
        }
        if (categoryDTO == null || categoryDTO.name() == null || categoryDTO.name().trim().isEmpty()) {
            throw new BlankParameterException("更新商品分类失败，商品分类名称不能为空");
        }
        //调用持久层对象的方法更新商品分类
        Category category = new Category(id, categoryDTO.name(), categoryDTO.display(),
                categoryDTO.orderNum(), null, null);
        if (categoryMapper.updateCategory(category) != 1) {
            throw new EntityNotFoundException("更新商品分类失败");
        }
    }
}
